// 矩阵求逆 高斯约旦消元法
// 测试链接 ：https://www.luogu.com.cn/problem/P4783
// 相关帖子 ：https://www.cnblogs.com/dx123/p/16756475.html
// 相关帖子 ：https://oi-wiki.org/math/linear-algebra/matrix/
// 提交以下的code，可以直接通过

#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int MAXN = 405;
const int MOD = 1000000007;
int n;
ll a[MAXN][MAXN << 1];

ll quickPow(ll a, ll b)
{
    int ans = 1;
    while(b)
    {
        if(b & 1) ans = ans * a % MOD;
        a = a * a % MOD;
        b >>= 1;
    }
    return ans;
}

bool gaussJordan()
{
    for(int i = 1; i <= n; ++i) // 枚举主元的行列
    {
        int r = i;
        for(int k = i; k <= n; ++k) // 找非 0 行
        {
            if(a[k][i])
            {
                r = k;
                break;
            }
        }
        if(r != i) swap(a[r], a[i]); // 换行
        if(!a[i][i]) return false;

        int x = quickPow(a[i][i], MOD - 2); // 求逆元
        for(int k = 1; k <= n; ++k) // 对角化
        {
            if(k == i) continue;
            int t = a[k][i] * x % MOD;
            // 主元所在行不变，主元所在列消成 0
            for(int j = i; j <= 2 * n; ++j)
            {
                a[k][j] = ((a[k][j] - t * a[i][j]) % MOD + MOD) % MOD;
            }
        }
        for(int j = 1; j <= 2 * n; ++j) a[i][j] = a[i][j] * x % MOD; // 除以主元
    }
    return true;
}

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= n; ++j)
        {
            scanf("%lld", &a[i][j]);
            a[i][i + n] = 1;
        }
    }
    if(gaussJordan())
    {
        for(int i = 1; i <= n; ++i)
        {
            for(int j = n + 1; j <= 2 * n; ++j)
            {
                printf("%lld ", a[i][j]);
            }
            puts("");
        }
    }
    else puts("No Solution");

    return 0;
}